#!/usr/bin/env python3
"""
对比演示脚本 - 展示有无 __init__.py 的差异
"""

import sys
import os

# 确保能够导入模块
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))

def demo_with_init():
    """演示使用 __init__.py 的版本"""
    print("🟢 使用 __init__.py 的版本")
    print("=" * 50)
    
    # 1. 简洁的导入方式
    print("\n📦 导入方式对比:")
    print("✅ 简洁导入:")
    print("   from mypackage import Engine, Processor, validate_input")
    
    import mypackage
    
    # 2. 统一的版本管理
    print(f"\n📋 版本信息:")
    print(f"   包版本: {mypackage.__version__}")
    print(f"   包作者: {mypackage.__author__}")
    
    # 3. 使用功能
    print(f"\n🔧 功能使用:")
    engine = mypackage.Engine("WithInit")
    engine.start()
    result = engine.process("测试数据")
    print(f"   处理结果: {result}")
    
    # 4. 工具函数
    is_valid = mypackage.validate_email("test@example.com")
    print(f"   邮箱验证: {is_valid}")
    
    # 5. 插件系统
    plugins = mypackage.plugin_manager.list_plugins()
    print(f"   插件系统: {plugins}")
    
    # 6. from package import * 的行为
    print(f"\n🎯 公共接口控制:")
    print(f"   __all__ 定义: {mypackage.__all__}")
    
    engine.stop()

def demo_without_init():
    """演示不使用 __init__.py 的版本"""
    print("\n🔴 不使用 __init__.py 的版本")
    print("=" * 50)
    
    # 1. 复杂的导入方式
    print("\n📦 导入方式对比:")
    print("❌ 复杂导入:")
    print("   from mypackage_without_init.core.engine import Engine")
    print("   from mypackage_without_init.core.processor import Processor") 
    print("   from mypackage_without_init.utils.validators import validate_input")
    
    # 实际导入
    from mypackage_without_init.core.engine import Engine
    from mypackage_without_init.core.processor import Processor
    from mypackage_without_init.utils.validators import validate_input, validate_email
    from mypackage_without_init.utils.helpers import format_output
    
    # 2. 没有统一的版本管理
    print(f"\n📋 版本信息:")
    print("   ❌ 没有统一的包版本管理")
    print("   ❌ 没有统一的包元数据")
    print("   ❌ 每个模块需要单独维护版本")
    
    # 3. 使用功能（没有初始化消息）
    print(f"\n🔧 功能使用:")
    print("   ❌ 没有包级别的初始化消息")
    engine = Engine("WithoutInit")
    engine.start()
    result = engine.process("测试数据")
    print(f"   处理结果: {result}")
    
    # 4. 工具函数
    is_valid = validate_email("test@example.com")
    print(f"   邮箱验证: {is_valid}")
    
    # 5. 没有插件系统
    print(f"\n🎯 功能限制:")
    print("   ❌ 没有自动化的插件系统")
    print("   ❌ 没有统一的包接口")
    print("   ❌ 无法使用 from package import * 语法")
    
    # 6. 格式化输出
    data = {"状态": "运行中", "问题": "导入复杂"}
    formatted = format_output(data, "pretty")
    print(f"   格式化输出:\n   {formatted.replace(chr(10), chr(10) + '   ')}")
    
    engine.stop()

def show_import_comparison():
    """展示导入方式的详细对比"""
    print("\n📋 导入方式详细对比")
    print("=" * 50)
    
    print("🟢 使用 __init__.py 的导入方式:")
    print("   # 简洁直观")
    print("   from mypackage import Engine, Processor")
    print("   from mypackage import validate_input, format_output")
    print("   from mypackage import plugin_manager")
    print("   ")
    print("   # 或者统一导入")
    print("   import mypackage")
    print("   engine = mypackage.Engine('test')")
    print("   ")
    print("   # 支持 * 导入（受 __all__ 控制）")
    print("   from mypackage import *")
    
    print("\n🔴 不使用 __init__.py 的导入方式:")
    print("   # 冗长复杂")
    print("   from mypackage_without_init.core.engine import Engine")
    print("   from mypackage_without_init.core.processor import Processor")
    print("   from mypackage_without_init.utils.validators import validate_input")
    print("   from mypackage_without_init.utils.helpers import format_output")
    print("   ")
    print("   # 没有统一的包接口")
    print("   # 无法使用 import mypackage_without_init 然后访问所有功能")
    print("   # 无法使用 from package import * 语法")

def show_structure_comparison():
    """展示项目结构对比"""
    print("\n🏗️ 项目结构对比")
    print("=" * 50)
    
    print("🟢 使用 __init__.py 的结构:")
    print("   mypackage/")
    print("   ├── __init__.py          # 包入口，定义公共接口")
    print("   ├── core/")
    print("   │   ├── __init__.py      # 模块入口")
    print("   │   ├── engine.py")
    print("   │   └── processor.py")
    print("   ├── utils/")
    print("   │   ├── __init__.py      # 工具模块入口")
    print("   │   ├── helpers.py")
    print("   │   └── validators.py")
    print("   └── plugins/")
    print("       ├── __init__.py      # 插件系统")
    print("       ├── plugin_a.py")
    print("       └── plugin_b.py")
    
    print("\n🔴 不使用 __init__.py 的结构:")
    print("   mypackage_without_init/")
    print("   ├── core/")
    print("   │   ├── engine.py        # 孤立的模块")
    print("   │   └── processor.py     # 孤立的模块")
    print("   └── utils/")
    print("       ├── helpers.py       # 孤立的模块")
    print("       └── validators.py    # 孤立的模块")
    print("   ")
    print("   ❌ 没有包的概念")
    print("   ❌ 没有统一的入口")
    print("   ❌ 模块之间缺乏组织")

def show_advantages_disadvantages():
    """展示优缺点对比"""
    print("\n⚖️ 优缺点对比")
    print("=" * 50)
    
    print("🟢 使用 __init__.py 的优势:")
    print("   ✅ 导入路径简洁直观")
    print("   ✅ 统一的包接口和版本管理")
    print("   ✅ 支持包级别的初始化")
    print("   ✅ 可以实现插件系统")
    print("   ✅ 控制公共API (通过 __all__)")
    print("   ✅ 支持 from package import * 语法")
    print("   ✅ 更好的代码组织和模块化")
    print("   ✅ 符合Python包的最佳实践")
    
    print("\n🔴 不使用 __init__.py 的缺点:")
    print("   ❌ 导入路径冗长复杂")
    print("   ❌ 缺乏统一的包接口")
    print("   ❌ 没有包级别的初始化")
    print("   ❌ 难以实现高级功能（如插件系统）")
    print("   ❌ 版本管理分散")
    print("   ❌ 无法使用 from package import * 语法")
    print("   ❌ 代码组织性差")
    print("   ❌ 维护困难")

def main():
    """主函数"""
    print("🆚 Python __init__.py 使用对比演示")
    print("=" * 60)
    
    # 演示使用 __init__.py 的版本
    demo_with_init()
    
    # 演示不使用 __init__.py 的版本
    demo_without_init()
    
    # 展示导入方式对比
    show_import_comparison()
    
    # 展示结构对比
    show_structure_comparison()
    
    # 展示优缺点对比
    show_advantages_disadvantages()
    
    print("\n📝 总结:")
    print("   使用 __init__.py 可以极大地简化包的使用和管理，")
    print("   是Python包开发的最佳实践。")
    print("   建议在所有Python包中都使用 __init__.py！")
    
    print("\n" + "=" * 60)
    print("演示完成！")

if __name__ == "__main__":
    main() 